#include<algorithm>
#include<stdio.h>
#include<string>
#include<stdlib.h>
#include<iostream>
using namespace std;

// //插入排序
// void sert(int *a,int n)
// {
//     for(int i=1;i<n;i++)
//     {
//         //先判断 如果当前位置i比前面数大就不进入
//         if(a[i]<a[i-1])
//         {
//             int tmp=a[i];
//             int j;
//             //j遍历
//             for(int j=i-1;j>=0&&tmp<a[j];j++)
//             {
//                 a[j+1]=a[j];
//             }
//             a[j+1]=tmp;
//         }
//     }
// }
//c语言实现个多态

// typedef void(*SoundFunc)(void*);
// //虚函数表
// typedef struct 
// {
//     SoundFunc makesound;//叫声
// }Vtable;


// //基类
// typedef struct 
// {
//     const char* name;
//     Vtable* table;
// }Animal;

// //实现子类虚函数(cat)
// void Catsound(void *self){
//     Animal* am=(Animal*)self;
//     printf("%s:喵喵~;\n",am->name);
// }
// //Cat 虚函数表
// Vtable CatVtable={
//     .makesound=Catsound
// };
// //dog
// void Dogsound(void *self){
//     Animal* am=(Animal*)self;
//     printf("%s:汪汪汪~~\n",am->name);
// }
// //Dog 虚函数表
// Vtable DogVtable={
//     .makesound=Dogsound
// };

// // 6. 子类构造函数（初始化基类属性和虚函数表）
// Animal* CatCreate(const char* name)
// {
//     Animal* cat=(Animal*)malloc(sizeof(Animal));
//     cat->name=name;
//     cat->table=&CatVtable;
//     return cat;
// }
// Animal* DogCreate(const char* name)
// {
//     Animal* dog=(Animal*)malloc(sizeof(Animal));
//     dog->name=name;
//     dog->table=&DogVtable;
//     return dog;
// }
// // 7. 统一调用接口（核心：多态实现）
// // 无需区分子类类型，直接通过基类指针调用虚函数表中的函数
// void AnimalMakesound(Animal* animal)
// {
//     if(animal&&animal->table&&animal->table->makesound)
//     {
//         animal->table->makesound(animal);
//     }
// }
// int main()
// {
//     Animal* cat=CatCreate("小猫");
//     Animal* dog=DogCreate("小狗");
//     //统一调用接口
//     AnimalMakesound(cat);
//     AnimalMakesound(dog);
//     free(cat);
//     free(dog);
//     return 0;
// }

class Singleton
{
    public:
    //禁用拷贝 和赋值
        Singleton(const Singleton&)=delete;
        Singleton& operator=(const Singleton&)=delete;

    //全局访问点 唯一返回值
        static Singleton& Getinstance()
        {
            static Singleton instance;
            return instance;
        }

        //测试接口
        void showtest(const string& msg)
        {
            cout<<"[Singleton:]"<<msg<<endl;
        }
private:
        //私有构造函数 禁止外部创建实例
    Singleton(){
        cout<<"实例创建成功"<<endl;
    }
    ~Singleton(){
        cout<<"销毁成功"<<endl;
    }
};
int main()
{
    Singleton& s1=Singleton::Getinstance();
    Singleton& s2=Singleton::Getinstance();

    s1.showtest("s1实例");
    s1.showtest("s1 s2都是同一个实例!");

    cout<<"s1地址:"<<&s1<<endl;
    cout<<"s2地址:"<<&s2<<endl;
}